<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title> - 服务计算 - 中山大学</title>
  <meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">


<meta name="author" content="潘茂林" /><meta name="description" content="开发 web 服务程序 1、概述 开发简单 web 服务程序 cloudgo，了解 web 服务器工作原理。 任务目标 熟悉 go 服务器工作原理 基于现有 web 库，编写一个简单 web 应用类" /><meta name="keywords" content="中山大学, 数据科学与计算机, 服务计算" />






<meta name="generator" content="Hugo 0.74.3 with theme even" />


<link rel="canonical" href="http://pmlpml.git.io/service-computing/post/ex-cloudgo-start/" />
<link rel="apple-touch-icon" sizes="180x180" href="/service-computing/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/service-computing/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/service-computing/favicon-16x16.png">
<link rel="manifest" href="/service-computing/manifest.json">
<link rel="mask-icon" href="/service-computing/safari-pinned-tab.svg" color="#5bbad5">



<link href="/service-computing/sass/main.min.8c3cbcb0324c2bb4875ceccba4007cbad4b4ac8377f33af9953c3e7684534a50.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">


<meta property="og:title" content="" />
<meta property="og:description" content="开发 web 服务程序 1、概述 开发简单 web 服务程序 cloudgo，了解 web 服务器工作原理。 任务目标 熟悉 go 服务器工作原理 基于现有 web 库，编写一个简单 web 应用类" />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://pmlpml.git.io/service-computing/post/ex-cloudgo-start/" />

<meta itemprop="name" content="">
<meta itemprop="description" content="开发 web 服务程序 1、概述 开发简单 web 服务程序 cloudgo，了解 web 服务器工作原理。 任务目标 熟悉 go 服务器工作原理 基于现有 web 库，编写一个简单 web 应用类">

<meta itemprop="wordCount" content="1456">



<meta itemprop="keywords" content="" />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content=""/>
<meta name="twitter:description" content="开发 web 服务程序 1、概述 开发简单 web 服务程序 cloudgo，了解 web 服务器工作原理。 任务目标 熟悉 go 服务器工作原理 基于现有 web 库，编写一个简单 web 应用类"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->

</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/service-computing/" class="logo">服务计算</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <a href="/service-computing/post/index-2020">
        <li class="mobile-menu-item">首页</li>
      </a><a href="/service-computing/post/">
        <li class="mobile-menu-item">归档</li>
      </a><a href="/service-computing/tags/">
        <li class="mobile-menu-item">标签</li>
      </a><a href="/service-computing/about/">
        <li class="mobile-menu-item">关于</li>
      </a>
  </ul>
</nav>
  <div class="container" id="mobile-panel">
    <header id="header" class="header">
        <div class="logo-wrapper">
  <a href="/service-computing/" class="logo">服务计算</a>
</div>

<nav class="site-navbar">
  <ul id="menu" class="menu">
    <li class="menu-item">
        <a class="menu-item-link" href="/service-computing/post/index-2020">首页</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/service-computing/post/">归档</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/service-computing/tags/">标签</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/service-computing/about/">关于</a>
      </li>
  </ul>
</nav>
    </header>

    <main id="main" class="main">
      <div class="content-wrapper">
        <div id="content" class="content">
          <article class="post">
    
    <header class="post-header">
      <h1 class="post-title"></h1>

      <div class="post-meta">
        <span class="post-time"> 0001-01-01 </span>
        
        
      </div>
    </header>

    <div class="post-toc" id="post-toc">
  <h2 class="post-toc-title"></h2>
  <div class="post-toc-content always-active">
    <nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#开发-web-服务程序">开发 web 服务程序</a>
          <ul>
            <li><a href="#1概述">1、概述</a></li>
            <li><a href="#2任务要求">2、任务要求</a></li>
            <li><a href="#tip源代码阅读">tip：源代码阅读</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>
  </div>
</div>
    <div class="post-content">
      <h2 id="开发-web-服务程序">开发 web 服务程序</h2>
<h3 id="1概述">1、概述</h3>
<p>开发简单 web 服务程序 cloudgo，了解 web 服务器工作原理。</p>
<p><strong>任务目标</strong></p>
<ol>
<li>熟悉 go 服务器工作原理</li>
<li>基于现有 web 库，编写一个简单 web 应用类似 cloudgo。</li>
<li>使用 curl 工具访问 web 程序</li>
<li>对 web 执行压力测试</li>
</ol>
<p><strong>相关知识</strong></p>
<p>课件：http://blog.csdn.net/pmlpml/article/details/78404838</p>
<h3 id="2任务要求">2、任务要求</h3>
<p><strong>基本要求</strong></p>
<ol>
<li>编程 web 服务程序 类似 cloudgo 应用。
<ul>
<li>要求有详细的注释</li>
<li>是否使用框架、选哪个框架自己决定 请在 README.md 说明你决策的依据</li>
</ul>
</li>
<li>使用 curl 测试，将测试结果写入 README.md</li>
<li>使用 ab 测试，将测试结果写入 README.md。并解释重要参数。</li>
</ol>
<p><strong>扩展要求</strong></p>
<p>选择以下一个或多个任务，以博客的形式提交。</p>
<ol>
<li>选择 net/http 源码，通过源码分析、解释一些关键功能实现</li>
<li>选择简单的库，如 mux 等，通过源码分析、解释它是如何实现扩展的原理，包括一些 golang 程序设计技巧。</li>
<li>在 docker hub 申请账号，从 github 构建 cloudgo 的 docker 镜像，最后在 Amazon 云容器服务中部署。
<ul>
<li>实现  Github - Travis CI - Docker hub - Amazon &ldquo;不落地&quot;云软件开发流水线</li>
</ul>
</li>
<li>其他 web 开发话题</li>
</ol>
<h3 id="tip源代码阅读">tip：源代码阅读</h3>
<p>阅读源代码是学习 golang 绕不开的任务，否则你无法达到你期望的水平与能力。
如何阅读源代码？这是一个非常复杂的话题，知识、经验和技巧都有很大作用。</p>
<p><strong>X.1 准备工作</strong></p>
<ol>
<li>了解对应语言的 Code Convention 非常重要，好的作品必须遵循这些开发约定，这些约定是实践中形成的。对于 Golang ：
<ul>
<li>建议首先阅读 <a href="https://go-zh.org/doc/effective_go.html">实效Go编程</a>。 但这不是一个简单工作，但语言基本约定以及它的目录，你必须知道！</li>
<li>使用 VSCode 作为编辑工具，它会提示变量命名、注释等基本要求</li>
<li>了解程序目录的基本约定</li>
<li>知道实体构造这类基本约定，如 New<em>Type</em>(), type.New() 。 它们在代码中非常常见</li>
<li>总之，这是一个积累的过程！</li>
</ul>
</li>
<li>最好有一定的 OO 设计模式知识，这对正确理解优秀开源产品至关重要！
<ul>
<li>面向对象的设计原则与设计模式知道的越多越好，有 java 基础最好</li>
<li>建议读物： <a href="https://book.douban.com/subject/11629400/">java设计模式</a> ，它是 java 库设计的经验总结。golang io 库就是完全模仿 java io 库，golang database 就是 java jdbc 的翻版，甲骨文告谷歌不是没道理的。</li>
</ul>
</li>
<li>了解你关注的产品的知识
<ul>
<li>例如你计划了解 golang web 服务器的实现，必须会使用它，并了解基本使用</li>
<li>必须去读官网文档，了解该内容的设计动机、设计理念</li>
<li>在网上找相似文章，以加快速度</li>
</ul>
</li>
</ol>
<p><strong>X.2 实现原理阅读</strong></p>
<p>以 net/http 库 web 工作原理阅读为例：</p>
<ol>
<li>有原理图，分四个步骤：创建 ServerSocket， 绑定并 listen， accept 连接， 创建 go 线程服务一个连接。</li>
<li>我们从入口函数 <code>ListenAndServe</code> 开始开始用 Ctrl 键开始追代码：
<ul>
<li>关注函数、方法参数中的 接口 和 函数 参数，是接口一定要了解接口的定义。OO 设计原理与模式大概率从这里开始</li>
<li>随时查阅 API 文档，了解相关类型的属性与方法</li>
<li>忽视任何错误处理、分支处理。尽管其中有许多有趣的东西，也要放弃</li>
<li>其中特别注意闭包、匿名函数、匿名类型这些编程技巧</li>
<li>特别注意接口断言语法 var.(type)</li>
<li>线程要注意上下文对象（context）的构建</li>
</ul>
</li>
</ol>
<p><strong>X.3 实现细节阅读</strong></p>
<p>以 net/http 库 DefaultServeMux 实现为例</p>
<ol>
<li>追到类型 ServeMux 。 当然的知道它的任务是将 “用户请求中 path 映射到 Handler”
<ul>
<li>map &ndash;&gt; (path/name?, handler)</li>
<li>muxEntry：Handler 是接口， pattern?</li>
</ul>
</li>
<li>关键代码
<ul>
<li>pathMatch 函数，你已经知道了，这就是 path == pattern 的简单匹配</li>
<li>在看看 ServeMux 方法的代码，基本就验证了你的想法</li>
</ul>
</li>
</ol>
<p><strong>X.4 模仿阅读</strong></p>
<p>以 spf13/cobra/command.go 为例：</p>
<ol>
<li>你以知道了 command 实现原理，见 <a href="http://blog.csdn.net/pmlpml/article/details/78326769">面向对象设计思想与 golang 编程</a> 最后图</li>
<li>必须知道 cli 处理参数基本流程</li>
<li>就是找设计模式要求的元素。
<ul>
<li>以 Execute() 为中心，研究 setPara, parse, run 的实现</li>
<li>子cmd存储 、parent</li>
<li>用简单实际命令，研究它在树结构command实例中执行的过程</li>
</ul>
</li>
</ol>
<p>利用它的代码，重写它的基本实现，可顺利完成！</p>
<p><strong>X.5 测试自己</strong></p>
<p><em>注意循序渐进，避免开始就搞复杂的东西。</em></p>
<p>分析 <code>gorilla/mux</code> （属于 X3 ）</p>
<ol>
<li>官网阅读它的功能与使用</li>
<li>从源代码角度对比 DefaultServeMux 与 gorilla/mux</li>
<li>有哪些收获？</li>
</ol>

    </div>

    <div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title"></span>
    <span class="item-content">潘茂林</span>
  </p>
  <p class="copyright-item">
    <span class="item-title"></span>
    <span class="item-content">
        0001-01-01
        
    </span>
  </p>
  
  
</div>
<footer class="post-footer">
      
      <nav class="post-nav">
        <a class="prev" href="/service-computing/post/ex-cloudgo-inout/">
            <i class="iconfont icon-left"></i>
            <span class="prev-text nav-default"></span>
            <span class="prev-text nav-mobile"></span>
          </a>
        <a class="next" href="/service-computing/post/ex-containerization/">
            <span class="next-text nav-default"></span>
            <span class="next-text nav-mobile"></span>
            <i class="iconfont icon-right"></i>
          </a>
      </nav>
    </footer>
  </article>
        </div>
        

  

  

      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="social-links">
      <a href="mailto:panml@mail.sysu.edu.cn" class="iconfont icon-email" title="email"></a>
  <a href="http://pmlpml.git.io/service-computing/index.xml" type="application/rss+xml" class="iconfont icon-rss" title="rss"></a>
</div>

<div class="copyright">
  <span class="power-by">
    %!(EXTRA string=<a class="hexo-link" href="https://gohugo.io">Hugo</a>)
  </span>
  <span class="division">|</span>
  <span class="theme-info">
     - 
    <a class="theme-link" href="https://github.com/olOwOlo/hugo-theme-even">Even</a>
  </span>

  

  <span class="copyright-year">
    &copy; 
    2018 - 
    2020
    <span class="heart">
      <i class="iconfont icon-heart"></i>
    </span>
    <span class="author">潘茂林</span>
  </span>
</div>
    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont icon-up"></i>
    </div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>



<script type="text/javascript" src="/service-computing/js/main.min.d7b7ada643c9c1a983026e177f141f7363b4640d619caf01d8831a6718cd44ea.js"></script>








</body>
</html>
